package com.winbomb.kingcard;

public interface IGameLogic {

	/**
	 * 开始一局游戏
	 */
	public void start();

	/**
	 * 停止游戏
	 */
	public void stop();

	/**
	 * 游戏是否已经停止
	 * 
	 * @return
	 */
	public boolean isStopped();

	/**
	 * 获取游戏的参与者（包括电脑和人）
	 * 
	 * @return
	 */
	public IPlayer[] getPlayers();

	/**
	 * 获取游戏参与人数（包括电脑和人）
	 * 
	 * @return
	 */
	public int getPlayerCount();

	/**
	 * 获得当前应该出牌的玩家
	 * 
	 * 说明：在玩家的回合中，出牌的可能不是玩家自己。例如发起进攻后需要目标玩家
	 * 
	 * 出牌抵挡进攻，这时getCurrPlayer获得的是目标玩家。
	 */
	public IPlayer getCurrPlayer();

	/**
	 * 设置当前该出牌的玩家
	 * 
	 * @param player
	 */
	public void setCurrPlayer(IPlayer player);

	/**
	 * 获得当前回合所属的玩家
	 * 
	 * 说明：在玩家的回合中，出牌的可能不是玩家自己。例如发起进攻后需要目标玩家
	 * 
	 * 出牌抵挡进攻，这时getCurrPlayer获得的是目标玩家。
	 */
	public IPlayer getCurrTurn();

	/**
	 * 获得当前的庄家
	 * 
	 * @return
	 */
	public IPlayer getCurrBanker();

	/**
	 * 获得游戏的进程
	 * 
	 * @return
	 */
	public IState getState();

	/**
	 * 设置游戏的进程
	 */
	public void setState(IState state);

	/**
	 * 游戏是否暂停
	 * 
	 * 在有些游戏动画播放过程中(例如战斗过程中牌相互攻击的动画),需要将游戏设置
	 * 
	 * 为暂停状态, 否则AI线程还会继续根据当前的状态选择行动,导致场面混乱.
	 * 
	 * @return
	 */
	public boolean isPaused();

	/**
	 * 设置游戏是否暂停
	 * 
	 * @param isPause
	 */
	public void setPause(boolean isPause);

	/**
	 * 获取游戏信息记录器
	 */
	public IGameRecord getGameRecorder();

	/**
	 * 下一步动作
	 */
	public void nextStep();

	/**
	 * 进入下一轮
	 * 
	 * 返回值表示是否是一个新的回合
	 */
	public boolean nextTurn();

	/**
	 * 获取牌堆
	 */
	public ICardPile getCardPile();

	/**
	 * 
	 * @return
	 */
	public IBattle getBattle();

	/**
	 * 获取交涉的管理器
	 * 
	 * @return
	 */
	public INegotiate getNegotiate();

	/**
	 * 
	 * @return
	 */
	public IPlayer getTributary();

	/**
	 * 
	 * @return
	 */
	public void setTributary(IPlayer player);

	/**
	 * 获取进行的回合数
	 * 
	 * @return
	 */
	public int getRoundCount();

	/**
	 * 获得本局消耗的时间, 单位是秒
	 * 
	 * @return
	 */
	public float getTimeCost();

	public void step(float dt);

	/**
	 * 游戏是否结束
	 * 
	 * @return
	 */
	public boolean isGameOver();

	/**
	 * 获得游戏最后的赢家
	 * 
	 * @return
	 */
	public IPlayer getWinner();

	/**
	 * 奖金
	 * 
	 * @return
	 */
	public int getBonus();

	/**
	 * 添加奖金
	 * 
	 * @param bonus
	 */
	public void addBonus(int bonus);

}
